Estimated | Actual | |||
Time (minutes) | Units (words) | Time | Units | Rates (min/word) |
293 | 2668 | 246 | 2668 | 0.09 |
Portage 懂得 "保护文件" 的概念. 这意味着, 当您更新软件, 它并不会马上把一些文件替换成新的版本, 而是提醒您有新的版本存在. 这对于配置文件 (/etc 下的那些文件) 尤其有用.
Portage 会创建一个名字形如 ._cfg0000_<name> (其中 <name> 部分为原文件名) 的文件而非直接覆盖原文件. 接着, 就由用户自己来决定如何将文件中不同的部分合并. 他/她可以使用 etc-update 来轻松进行这一操作. 稍后我们会对 etc-update 进行详细介绍.
Portage 不是以文件为单位进行保护的, 而是一次性地保护整个目录. CONFIG_PROTECT 变量列出了所有受保护的目录. 而它们的子目录同样受到保护. CONFIG_PROTECT 定义在 /etc/make.globals 中, 不过, 如果您想改变它, 则应该在 /etc/make.conf (为了保证一致性 (consistent), 我们使用 /etc/make.conf 进行所有 Portage 相关的配置) 中进行声明.
代码清单 1: CONFIG_PROTECT 例 |
CONFIG_PROTECT="/etc /usr/share/config /usr/kde/3.1/share/config" |
如果您想保护某个目录, 而又不想对所有的子目录都进行保护. 则可以在 CONFIG_PROTECT_MASK 变量中把它们列出来, 声明为 "不保护" 对象. CONFIG_PROTECT_MASK 在 /etc/make.conf 中同样有其默认值, 不过我们还是得在 /etc/make.conf 中声明以改变其值.
代码清单 2: CONFIG_PROTECT_MASK 例 |
CONFIG_PROTECT_MASK="/etc/init.d" |
更多关于配置文件之保护的内容可在 emerge 的在线帮助中找到:
代码清单 3: 获取关于配置文件之保护的信息 |
# emerge --help config |
etc-update 是一个协助我们合并 ._cfg0000_<name> 文件的工具. 它提供了一个交互式的合并策略 (setup) 同时也能自动合并一些无关紧要的更改 (trivial changes).
运行 etc-update 很简单:
代码清单 4: 运行 etc-update |
# etc-update |
在合并完一些无关紧要的更改后, 您会进入到一个给出等待更新文件列表的提示环境中. 在底部您可以看到一些操作选项:
代码清单 5: etc-update 选项 |
Please select a file to edit by entering the corresponding number. (请输入相应的数字以选择一个文件进行编辑) (-1 to exit) (-3 to auto merge all remaining files) (-1 退出) (-3 自动合并余下的所有文件) (-5 to auto-merge AND not use 'mv -i'): (-5 自动合并且不使用 'mv -i" 命令 (Cure: 文件改名时不再提示)): |
如果您输入 -1, etc-update 将不做任何动作就退出. 如果您输入 -3 或 -5, 列表中所有配置文件都会被其新版本所替换. 因此, 首先选择并处理不应该进行自动更新的文件将非常重要. 这可以通过简单地输入配置文件左边的数字来选择 (要进行手动合并的配置文件):
代码清单 6: 更新某个配置文件 |
Beginning of differences between /etc/pear.conf and /etc/._cfg0000_pear.conf
(开始显示不同之处)
[...]
End of differences between /etc/pear.conf and /etc/._cfg0000_pear.conf
(显示完毕)
1) Replace original with update (以新文件替换原文件)
2) Delete update, keeping original as is (保留原文件, 删除新文件)
3) Interactively merge original with update (交互式合并俩文件)
4) Show differences again (再显示一次不同之处)
|
您现在可以看到两个文件之间的差异. 如果您觉得新的配置文件没有问题, 那就输入 1. 如果您觉得新的配置文件无甚必要, 或是一点新的有用的东西都没有, 那就输入 2. 如果您想交互式地更新您当前的配置文件, 则输入 3.
关于交互式合并的内容此处并无细述的必要. 不过, 为了完整性起见, 我们下面将列出一些在您交互式合并文件时可用的命令. 您将看到两行内容 (一是原来的, 二是新的) 以及一个提示符, 您可以在提示符后输入下面这些命令 (You are greeted with two lines (the original one, and the proposed new one) and a prompt at which you can enter one of the following commands):
代码清单 7: 交互式合并中可用的命令 |
ed: Edit then use both versions, each decorated with a header. eb: Edit then use both versions. el: Edit then use the left version. er: Edit then use the right version. e: Edit a new version. l: Use the left version. r: Use the right version. s: Silently include common lines. v: Verbosely include common lines. q: Quit. |
在完成重要配置文件的更新后, 您现在可以让余下的配置文件自动更新. 在找不到任何可供更新的配置文件之后, etc-update 将退出.
Gentoo 日益流行, 镜像的使用功不可没 (As Gentoo is becoming increasingly popular, the use of mirrors is greatly appreciated. (Cure: 镜像加速了 Gentoo 的流行?)). Portage 用三个变量来定义镜像: 一个用于 rsync 镜像 (用来同步您的 Portage 树), 一个用于 distfiles (用来下载源码包的), 一个用于预编译包.
所有可用的 distfiles 镜像在我们的 Gentoo 镜像页中列出. 您还可以用 mirrorselect 来简化系统的镜像设置过程. 不过, 首先让我们一个个来看这些变量...
SYNC 变量包含了您想用的 rsync 镜像. 例如, 要使用 rsync://rsync.namerica.gentoo.org/gentoo-portage, 您得在 /etc/make.conf 中定义它:
代码清单 8: 在 /etc/make.conf 中定义 SYNC |
SYNC="rsync://rsync.namerica.gentoo.org/gentoo-portage" |
GENTOO_MIRRORS 变量则列出了您想使用的 distfiles 镜像列表. 要想优先使用 ftp://ibiblio.org/pub/Linux/distributions/gentoo, 其次使用 http://www.gtlib.cc.gatech.edu/pub/gentoo, 您可以在 /etc/make.conf 中这样定义:
代码清单 9: 在 /etc/make.conf 中定义 GENTOO_MIRRORS |
GENTOO_MIRRORS="ftp://ibiblio.org/pub/Linux/distributions/gentoo http://www.gtlib.cc.gatech.edu/pub/gentoo" |
PORTAGE_BINHOST 变量列出了您想使用的预编译包的镜像. 例如, 要使用 ftp://login:pass@grp.mirror.site/pub/grp/i686/athlon-xp, 您得在 /etc/make.conf 中这么定义:
代码清单 10: 在 /etc/make.conf 中定义 PORTAGE_BINHOST |
PORTAGE_BINHOST="ftp://login:pass@grp.mirror.site/pub/grp/i686/athlon-xp" |
许多软件包都有一个包含了 'mirror://' 的 SRC-变量 (SRC-variable). 这些软件包在多个主机上 (像 sourceforge, gnu, ...) 都有其源码. 任何时候 Portage 遇到这样一个 SRC-变量, 它都会从 /etc/portage/mirrors 中寻找主机, 如果这个文件中找不到主机, 则会从 /usr/portage/profiles/thirdpartymirrors 中寻找. (Many packages have a SRC-variable containing 'mirror://'. Such packages have their sourcecode available on many hosts (think sourceforge, gnu, ...). Whenever Portage comes across such an SRC-variable, it will look up the actual host from /etc/portage/mirrors and, if no host is found in this file, from /usr/portage/profiles/thirdpartymirrors.)
您可在 /etc/portage/mirrors 中定义自己最喜欢使用的镜像. 任何时候要从 sourceforge 上下载软件包时, 您都希望使用 http://keihanna.dl.sourceforge.net/ 这一镜像, 则输入:
代码清单 11: /etc/portage/mirrors 例 |
sourceforge http://keihanna.dl.sourceforge.net |
您还可以声明特殊的本地镜像. 这些镜像任何时候都会被首先查看, 即便软件包自身的 SRC 变量中没有 'mirror://' 或它已声明自身不应该被镜像. (You can also declare the special local mirrors. These mirrors will always be checked first, even when the package itself has no 'mirror://' in it's SRC variable or when it has declared that it shouldn't be mirrored.)
要想用 mirrorselect, 我们首先安装它 (如果您之前没装的话):
代码清单 12: 安装 mirrorselect |
# emerge mirrorselect |
您现在可以选择让 mirrorselect 为您自动选择最佳的镜像, 或者手动地从一个列表中选择镜像. 要了解更多关于 mirrorselect 的内容, 只需从命令行运行它 - 它就会给您一个关于自己的概述.
代码清单 13: 运行 mirrorselect |
# mirrorselect |
Portage 用以下载归档文件 (archive files) 的程序可以通过 FETCHCOMMAND 和 RESUMECOMMAND 来指定./etc/make.conf.example 和 /etc/make.globals 文件中给出了几个例子. Portage 默认使用 wget:
代码清单 14: 默认的 FETCHCOMMAND 与 RESUMECOMMAND |
FETCHCOMMAND="/usr/bin/wget -t 5 --passive-ftp -P \${DISTDIR} \${URI}" RESUMECOMMAND="/usr/bin/wget -c -t 5 --passive-ftp -P \${DISTDIR} \${URI}" |
其中 ${DISTDIR} 为下载文件所存放之地 (/usr/portage/distfiles), 而 ${URI} 则是 Portage 要下载的文件本身.
由于 Portage 默认使用 wget, 您可以通过设定 http_proxy 和 ftp_proxy (留意小写) 变量来使用代理. 尽管您可以在 /etc/make.conf 中同样做到这点, 不过我们还是建议您选择更为通用的方法, 因为许多其他的工具也会用到 http_proxy 与 ftp_proxy 这两个变量 (/etc/make.conf 仅为 Portage 所用). 请阅读环境变量一章以了解如何设置系统范围适用的环境变量.
rsync 是 emerge sync 用来更新 Portage 树的. Portage 中三个用以改变 rsync 行为的的变量为: RSYNC_EXCLUDEFROM, RSYNC_RETRIES 与 RSYNC_TIMEOUT.
要 "保护" ebuilds 不被 emerge sync 更新或删除的方法之一是使用 RSYNC_EXCLUDEFROM 变量. 我们需要把这些排除在 (更新或删除对象之) 外的文件写到一个为 rsync 所用的文件里, 这一文件默认为 /etc/portage/rsync_excludes. 由于这种方式在操作不慎的情况下会破坏依赖关系, 所以我们并不建议使用. 我们稍后会讨论 PORTDIR_OVERLAY, 那才是建议使用的方法. 要了解更多信息, 请阅读 rsync 的手册.
代码清单 15: RSYNC_EXCLUDEFROM 变量 |
RSYNC_EXCLUDEFROM="/etc/portage/rsync_excludes" |
rsync 失败之后, 它在换用另一个 rsync 服务器之前会重试一定的次数. 该重试次数定义在 RSYNC_RETRIES, 其默认值为 3:
代码清单 16: RSYNC_RETRIES 变量 |
RSYNC_RETRIES="3" |
如果您在使用一个很慢的 rsync 服务器, 在一直收不到数据的情况下, rsync 会超时暂停 (Cure: time-out. 以重试, 换用其他服务器, 或退出). 超时前要等待的秒数在 RSYNC_TIMEOUT 中设定, 其默认值为 180:
代码清单 17: RSYNC_TIMEOUT 变量 |
RSYNC_TIMEOUT="180" |
Portage 中一切皆可配置, 包括那些 Portage 所需的用于各种目的的目录和文件. 要改变默认的位置 (/etc/make.global 中所设定的), 您得到 - 还有哪儿呢:) - /etc/make.conf 中设定正确的变量:
敬告: 如果您改变了某个变量以指向不同的位置, 请切记不要在路径的末尾加上一个 /!(Cure: 为什么? 粗略 google 了一下, 没答案...) |
Portage 树所在的位置定义在 PORTDIR 中. 其默认值为 /usr/portage:
代码清单 18: PORTDIR 变量 |
PORTDIR="/usr/portage" |
如果您想在 "正式的 (official)" Portage 树之外有个自己的 (local) Portage 树, 则要定义 PORTDIR_OVERLAY 变量. 它里面列出的位置不会受到 emerge sync 动作的影响: 这些位置里的 ebuilds 不会被更新或删除, 但仍是您 Portage 树中的一部分.
代码清单 19: PORTDIR_OVERLAY 变量 |
PORTDIR_OVERLAY="/usr/local/portage" |
下载回来的源代码包 (就是所谓的 distfiles) 存放的位置在 DISTDIR 变量中定义. 其默认值为 ${PORTDIR}/distfiles:
代码清单 20: DISTDIR 变量 |
DISTDIR="${PORTDIR}/distfiles" |
预编译包存放的位置在 PKGDIR 变量中定义. 其默认值为 ${PORTDIR}/packages:
代码清单 21: PKGDIR 变量 |
PKGDIR="${PORTDIR}/packages" |
RPM 包 (没错了, 有些软件包是以 RPM 形式提供的) 所存放的位置在 RPMDIR 中定义. 其默认值为 ${PORTDIR}/rpm:
代码清单 22: RPMDIR 变量 |
RPMDIR="${PORTDIR}/rpm" |
Portage 使用一个临时的位置来编译其 ebuild. 这一位置在 PORTAGE_TMPDIR 中定义. 其默认值为 /var/tmp:
代码清单 23: PORTAGE_TMPDIR 变量 |
PORTAGE_TMPDIR="/var/tmp" |
默认情况下, Portage 会在 PORTAGE_TMPDIR 里创建一个 portage 目录. 这在 BUILD_PREFIX 变量中定义:
代码清单 24: BUILD_PREFIX 变量 |
BUILD_PREFIX="${PORTAGE_TMPDIR}/portage" |
如果您打算改变这一位置, 请确保这一临时目录所在的分区上有足够的空间: 因为在编译一些巨型软件的时候, 这个目录的大小可以膨胀到 2G 或以上!
PORT_LOGDIR 是一个特殊的变量, 默认是没有设置. 在您定义它之后, Portage 会以 ebuild 为单位在这一目录中进行日志记录 (Portage will create per-ebuild logs in the given directory):
代码清单 25: PORT_LOGDIR 变量 |
PORT_LOGDIR="/var/log/portage" |
Portage 支持以不同的精细度 (类似优先权的一个值) 进行编译. 如果您想 Portage 以更高的精细度编译软件包 (这样在编译过程中我们会得到一个响应程度更高的系统 (resulting in a more responsive system during the building process), 不过同时也将增加编译时间), 您可以给 PORTAGE_NICENESS 一个正数:
代码清单 26: PORTAGE_NICENESS 变量 |
PORTAGE_NICENESS="3" |
在一些情况下, 您需要同一软件的多个版本 (包括其库) 共存于系统中. Portage 以在 ebuild 中定义 SLOT 变量的方式支持这一需求. 作为用户, 您没有必要了解 SLOT 的原理, 但很有必要知道这有这一功能支持.
在您安装一个软件的新版本时, Portage 会检查该软件包中是否声明了 SLOT 变量. 如果声明了, 且俩软件包 (新版的和原来的) 的 SLOT 值都不同. Portage 就不会去碰原来的软件包.
不过, 如果 SLOT 值一样 (通常都这情况), 则默认删除旧版本的软件. 为了让用户有机会可以中止这一删除动作, Portage 会在删除前进行数秒钟的倒计时. 该倒计时的数量在 CLEAN_DELAY 中定义, 其默认值为 5:
代码清单 27: CLEAN_DELAY 变量 |
CLEAN_DELAY="5" |
如果您并不想让 Portage 自动删除旧版本的软件 (这过程被称为 "清除工作 (cleaning)"), 则您可以把 AUTOCLEAN 变量设为 no:
代码清单 28: AUTOCLEAN 变量 |
AUTOCLEAN="no" |
我们已经看过很多变量了, 不过还没完. 装过 Gentoo 的用户应该都知道 CHOST, CFLAGS 和 CXXFLAGS 变量, 它们为编译器所用, 以编译和优化软件包.
关于它们的更多的信息可以在 gcc 的信息页中找到, 或看 GCC 在线手册.
代码清单 29: 获取关于 CHOST, CFLAGS 与 CXXFLAGS 的信息 |
# info gcc (选择 "Invoking gcc (调用 gcc)") (选择 "Optimize options (优化选项)") |
如果定义了 DEBUGBUILD 变量, Portage 就不会对编译出来的二进制文件和库文件进行 strip 动作 (Cure: strip 会从这些文件中去除 debug 标记等, 可以让它们体积变小运行更快, 当然, 也就让 debug 更难) 以让 debug 工作更容易进行.
代码清单 30: DEBUGBUILD 变量 |
# 请不要把它的值设成 "false"; 而应该直接把这行删掉. Portage 不会 # 这个值的, 它仅仅检查这个变量定义了没有. DEBUGBUILD="true" |
MAKEOPTS 为 make 所用, make 是用来简化软件包编译过程的一个工具. 我们定义 MAKEOPTS 来让 make 同时进行几个编译工作 (尤其当您有个多 CPU 系统, 或使用前面提到过的 distcc 时).
要让 make 同时进行三个编译工作, 则把 MAKEOPTS 设为 -j3:
代码清单 31: MAKEOPTS 变量 |
MAKEOPTS="-j3" |
请不要在 /etc/make.conf 中设置 ROOT 变量, 而应该把它设置成环境变量. Portage 通过检查这一变量以得知需要把软件装到哪里. 当然, 其默认值为 /. 我们下面给出一个例子, 看看如何把 gnumeric 装到 /mnt/gentoo 上而非您当前运行中的系统:
代码清单 32: ROOT 变量 |
# ROOT="/mnt/gentoo" emerge gnumeric |
(Cure: 这意味着, 我们可以利用这一功能来进行一种情况下的系统恢复: 如误删了 module-init-tools 这一加载内核模块的软件包, 系统将无法正常启动. 这时, 我们可以利用另一个正常的 Gentoo 系统, 如 LiveCD 启动盘提供的环境, 在把原系统的系统分区都挂载上来后, 如挂载到 /mnt/gentoo 下, 把 module-init-tools 为原系统重新装上, 搞定.)
默认情况下, Portage 会给出彩色的输出信息以提高可读性. 如果您不想要这效果, 则把 NOCOLOR 变量的值设为 true:
代码清单 33: NOCOLOR 变量 |
NOCOLOR="true" |
如果您想要上述所列各个变量的便捷参考, 请查看 make.conf 的手册页:
代码清单 34: 查看 make.conf 的手册页 |
# man make.conf |
/etc/make.conf.example 文件中给出了大量的注释, 应该有您感兴趣的例子.